<Configuration status="WARN">

    <Properties>
        <Property name="FILE_NAME">${projectDefinitionDO.serverProjectDefinitionDO.serverProjectName}</Property>
        <#noparse><Property name="LOG_HOME">${env:APP_LOG_BASE_PATH:-/app/logs/}/${FILE_NAME}</Property></#noparse>
        <Property name="pattern_layout">%d{yyyy-MM-dd HH:mm:ss.SSS}|%-5p|[%t]|[%c{1}:%L]|%m%throwable%n</Property>
    </Properties>
    <!--先定义所有的appender-->
    <appenders>
        <!--这个输出控制台的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="${r'${pattern_layout}'}"/>
        </console>

        <!-- 文件打印配置，支持文件滚动归档和缓存；filePattern设置滚动单位为d(天)，%i代表从1开始的正整数，%3i可为3位 -->
        <RollingRandomAccessFile name="file" fileName="${r'${LOG_HOME}'}/${r'${FILE_NAME}'}-run.log"
                                 filePattern="${r'${LOG_HOME}'}/back/run/${r'${FILE_NAME}'}-run-%d{yyyy-MM-dd}-%i.log.gz">
            <!-- 打印格式 -->
            <PatternLayout pattern="${r'${pattern_layout}'}"/>
            <!-- 滚动策略 -->
            <Policies>
                <!-- 文件每超过10MB就生成一个新的日志文件 -->
                <SizeBasedTriggeringPolicy size="10MB"/>

                <!-- 每1天生成一个新的日志文件，并修正时间，这个一天是根据filePattern的精度值确定的 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
            <DefaultRolloverStrategy max="30">
                <!--用户可以更好地控制选择文件的属主、属组、权限等属性中的哪一个来作为滚动依据-->
                <PosixViewAttribute basePath="${r'${LOG_HOME}'}/run">
                    <IfFileName glob="*.log.gz"/>
                </PosixViewAttribute>

                <!--delete表示删除满足条件的文件，maxDepth代表目录扫描的深度-->
                <Delete basePath="${r'${LOG_HOME}'}/run" maxDepth="1">
                    <!--制定文件名称-->
                    <IfFileName glob="*.log.gz"/>
                    <!--删除10天前的日志文件-->
                    <IfLastModified age="30d"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingRandomAccessFile>


        <!-- 这个会打印出所有的info及以下级别的信息，每次大小超过size，则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩，作为存档-->
        <!--filePattern  指定新建日志文件的名称格式-->
        <RollingRandomAccessFile name="RollingRandomAccessFileInfo" fileName="${r'${LOG_HOME}'}/${r'${FILE_NAME}'}-info.log"
                     filePattern="${r'${LOG_HOME}'}/back/info/$${r'${date:yyyy-MM}'}-${r'${FILE_NAME}'}-info-%d{yyyy-MM-dd}-%i.log.gz">
            <!--控制台只输出level及以上级别的信息（onMatch），其他的直接拒绝（onMismatch）-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${r'${pattern_layout}'}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>
            <DefaultRolloverStrategy max="30">
                <!--用户可以更好地控制选择文件的属主、属组、权限等属性中的哪一个来作为滚动依据-->
                <PosixViewAttribute basePath="${r'${LOG_HOME}'}/info">
                    <IfFileName glob="*.log.gz"/>
                </PosixViewAttribute>

                <!--delete表示删除满足条件的文件，maxDepth代表目录扫描的深度-->
                <Delete basePath="${r'${LOG_HOME}'}/info" maxDepth="1">
                    <!--制定文件名称-->
                    <IfFileName glob="*.log.gz"/>
                    <!--删除10天前的日志文件-->
                    <IfLastModified age="30d"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingRandomAccessFile>


        <RollingRandomAccessFile name="RollingRandomAccessFileWarn" fileName="${r'${LOG_HOME}'}/${r'${FILE_NAME}'}-warn.log"
                     filePattern="${r'${LOG_HOME}'}/back/warn/$${r'${date:yyyy-MM}'}-${r'${FILE_NAME}'}-warn-%d{yyyy-MM-dd}-%i.log.gz">
            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${r'${pattern_layout}'}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>
            <DefaultRolloverStrategy max="30">
                <!--用户可以更好地控制选择文件的属主、属组、权限等属性中的哪一个来作为滚动依据-->
                <PosixViewAttribute basePath="${r'${LOG_HOME}'}/warn">
                    <IfFileName glob="*.log.gz"/>
                </PosixViewAttribute>

                <!--delete表示删除满足条件的文件，maxDepth代表目录扫描的深度-->
                <Delete basePath="${r'${LOG_HOME}'}/warn" maxDepth="1">
                    <!--制定文件名称-->
                    <IfFileName glob="*.log.gz"/>
                    <!--删除10天前的日志文件-->
                    <IfLastModified age="30d"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingRandomAccessFile>

        <RollingRandomAccessFile name="RollingRandomAccessFileError" fileName="${r'${LOG_HOME}'}/${r'${FILE_NAME}'}-error.log"
                     filePattern="${r'${LOG_HOME}'}/back/error/$${r'${date:yyyy-MM}'}-${r'${FILE_NAME}'}-error-%d{yyyy-MM-dd}-%i.log.gz">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${r'${pattern_layout}'}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>
            <DefaultRolloverStrategy max="30">
                <!--用户可以更好地控制选择文件的属主、属组、权限等属性中的哪一个来作为滚动依据-->
                <PosixViewAttribute basePath="${r'${LOG_HOME}'}/error">
                    <IfFileName glob="*.log.gz"/>
                </PosixViewAttribute>

                <!--delete表示删除满足条件的文件，maxDepth代表目录扫描的深度-->
                <Delete basePath="${r'${LOG_HOME}'}/error" maxDepth="1">
                    <!--制定文件名称-->
                    <IfFileName glob="*.log.gz"/>
                    <!--删除10天前的日志文件-->
                    <IfLastModified age="30d"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingRandomAccessFile>

        <Async name="AsyncInfo">
            <AppenderRef ref="RollingRandomAccessFileInfo"/>
        </Async>
        <Async name="AsyncWarn">
            <AppenderRef ref="RollingRandomAccessFileWarn"/>
        </Async>
        <Async name="AsyncError">
            <AppenderRef ref="RollingRandomAccessFileError"/>
        </Async>
    </appenders>

    <!--然后定义logger，只有定义了logger并引入的appender，appender才会生效-->
    <loggers>
        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <logger name="org.springframework" level="WARN"/>
        <logger name="org.mybatis" level="WARN"/>
        <!-- ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF , -->
        <#noparse><root level="${sys:APP_LOG_LEVEL:-info}"></#noparse>
            <appender-ref ref="Console"/>
            <appender-ref ref="AsyncInfo"/>
            <appender-ref ref="AsyncWarn"/>
            <appender-ref ref="AsyncError"/>
        </root>
    </loggers>

</Configuration>